개요
tanh(하이퍼볼릭 탄젠트, Hyperbolic Tangent)는 인공신경망에서 널리 사용되는 비선형 활성화 함수 중 하나입니다. 수학적으로는 입력값에 대한 하이퍼볼릭 탄젠트 값을 출력하며, 출력 범위가 -1에서 1 사이로 제한된다는 특징을 가지고 있습니다. 이는 신경망의 학습 안정성과 수렴 속도에 긍정적인 영향을 미칠 수 있어, 특히 초기 신경망 모델에서 자주 사용되었습니다.
tanh는 시그모이드(Sigmoid) 함수와 유사한 S자 형태의 곡선을 가지지만, 출력 범위가 대칭적이라는 점에서 차이가 있으며, 이로 인해 제로 중심(zero-centered) 출력을 제공하여 역전파(Backpropagation) 과정에서 기울기 업데이트가 더 효율적으로 이루어질 수 있습니다.
tanh 함수는 다음과 같은 수학적 식으로 정의됩니다:
$$
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} = \frac{\sinh(x)}{\cosh(x)}
$$
또는 시그모이드 함수 $ \sigma(x) $를 이용해 다음과 같이 표현할 수도 있습니다:
$$
\tanh(x) = 2\sigma(2x) - 1
$$
특징
- 정의역: $ x \in (-\infty, +\infty) $
- 치역: $ y \in (-1, 1) $
- 기울기(도함수):
$$
\frac{d}{dx}\tanh(x) = 1 - \tanh^2(x)
$$
이 도함수는 입력값이 0 근처일 때 기울기가 1에 가까우며, 입력값이 커질수록 기울기가 0에 수렴합니다.
신경망에서의 역할
활성화 함수로서의 기능
신경망의 각 뉴런은 가중합을 계산한 후 활성화 함수를 적용하여 출력을 결정합니다. tanh는 이 과정에서 다음과 같은 역할을 수행합니다:
- 비선형성 도입: 선형 함수만 사용할 경우 신경망은 단일 계층과 동일한 표현력을 가지게 됩니다. tanh는 비선형 함수이므로, 깊은 신경망이 복잡한 패턴을 학습할 수 있도록 합니다.
- 출력 정규화: 입력값이 크거나 작을수록 출력이 각각 1 또는 -1에 수렴하므로, 신호의 크기를 제한하여 수치적 안정성을 제공합니다.
- 제로 중심 출력: 출력이 0을 중심으로 대칭적이므로, 다음 레이어의 입력 분포가 균형을 이루게 되어 기울기 소실(vanishing gradient) 문제를 부분적으로 완화할 수 있습니다.
장점과 단점
장점
| 장점 |
설명 |
| 제로 중심 출력 |
평균이 0에 가까운 출력을 생성하므로, 다음 레이어의 가중치 업데이트가 더 안정적임 |
| 비선형성 |
복잡한 데이터 패턴 학습 가능 |
| 미분 가능성 |
모든 지점에서 미분 가능하여 역전파 알고리즘에 적합 |
단점
| 단점 |
설명 |
| 기울기 소실 문제 |
입력값이 매우 크거나 작을 경우 기울기가 거의 0이 되어, 깊은 네트워크에서 역전파 시 그래디언트가 사라질 수 있음 |
| 계산 비용 |
지수 함수를 포함하므로 ReLU와 같은 단순 함수보다 계산이 복잡함 |
| 출력 포화 |
입력이 커지면 출력이 포화되어 변화가 거의 없음 → 학습 정체 유발 가능 |
tanh vs. 다른 활성화 함수
| 함수 |
출력 범위 |
제로 중심 |
기울기 소실 |
계산 복잡도 |
주요 사용처 |
| tanh |
(-1, 1) |
✅ |
중간 |
중간 |
RNN, 전통적 DNN |
| Sigmoid |
(0, 1) |
❌ |
심함 |
중간 |
이진 분류 출력층 |
| ReLU |
[0, ∞) |
❌ |
없음 (양수 구간) |
낮음 |
CNN, DNN 일반 레이어 |
| Leaky ReLU |
(-∞, ∞) |
❌ |
약함 |
낮음 |
ReLU의 대안 |
사용 사례
- 순환 신경망(RNN): RNN의 내부 상태 업데이트에 tanh가 자주 사용됩니다. 예를 들어, 전통적인 LSTM에서는 셀 상태(candidate cell state) 계산에 tanh 함수를 적용합니다.
- 자기회귀 모델: 과거 정보를 요약하는 구조에서 출력의 대칭성이 유리하게 작용합니다.
- 생성 모델: 생성적 적대 신경망(GAN)이나 오토인코더의 일부 레이어에서 사용되기도 합니다.
코드 예시 (Python)
import numpy as np
import matplotlib.pyplot as plt
def tanh(x):
return np.tanh(x)
def tanh_derivative(x):
return 1 - np.tanh(x) ** 2
# 시각화
x = np.linspace(-5, 5, 100)
y = tanh(x)
dy = tanh_derivative(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='tanh(x)', color='blue')
plt.plot(x, dy, label="tanh'(x)", color='red', linestyle='--')
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.grid(True)
plt.title('tanh 함수와 그 도함수')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
참고 자료 및 관련 문서
참고: 최근에는 ReLU 및 그 변형(GELU, Swish 등)이 대부분의 심층 신경망에서 tanh를 대체하고 있으나, 여전히 특정 아키텍처(RNN 기반 모델 등)에서는 유용하게 사용되고 있습니다.
# tanh
## 개요
**tanh**(하이퍼볼릭 탄젠트, Hyperbolic Tangent)는 인공신경망에서 널리 사용되는 **비선형 활성화 함수** 중 하나입니다. 수학적으로는 입력값에 대한 하이퍼볼릭 탄젠트 값을 출력하며, 출력 범위가 **-1에서 1 사이**로 제한된다는 특징을 가지고 있습니다. 이는 신경망의 학습 안정성과 수렴 속도에 긍정적인 영향을 미칠 수 있어, 특히 초기 신경망 모델에서 자주 사용되었습니다.
tanh는 시그모이드(Sigmoid) 함수와 유사한 S자 형태의 곡선을 가지지만, 출력 범위가 대칭적이라는 점에서 차이가 있으며, 이로 인해 **제로 중심**(zero-centered) 출력을 제공하여 역전파(Backpropagation) 과정에서 기울기 업데이트가 더 효율적으로 이루어질 수 있습니다.
---
## 수학적 정의
tanh 함수는 다음과 같은 수학적 식으로 정의됩니다:
$$
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} = \frac{\sinh(x)}{\cosh(x)}
$$
또는 시그모이드 함수 $ \sigma(x) $를 이용해 다음과 같이 표현할 수도 있습니다:
$$
\tanh(x) = 2\sigma(2x) - 1
$$
### 특징
- **정의역**: $ x \in (-\infty, +\infty) $
- **치역**: $ y \in (-1, 1) $
- **기울기**(도함수):
$$
\frac{d}{dx}\tanh(x) = 1 - \tanh^2(x)
$$
이 도함수는 입력값이 0 근처일 때 기울기가 1에 가까우며, 입력값이 커질수록 기울기가 0에 수렴합니다.
---
## 신경망에서의 역할
### 활성화 함수로서의 기능
신경망의 각 뉴런은 가중합을 계산한 후 활성화 함수를 적용하여 출력을 결정합니다. tanh는 이 과정에서 다음과 같은 역할을 수행합니다:
- **비선형성 도입**: 선형 함수만 사용할 경우 신경망은 단일 계층과 동일한 표현력을 가지게 됩니다. tanh는 비선형 함수이므로, 깊은 신경망이 복잡한 패턴을 학습할 수 있도록 합니다.
- **출력 정규화**: 입력값이 크거나 작을수록 출력이 각각 1 또는 -1에 수렴하므로, 신호의 크기를 제한하여 수치적 안정성을 제공합니다.
- **제로 중심 출력**: 출력이 0을 중심으로 대칭적이므로, 다음 레이어의 입력 분포가 균형을 이루게 되어 **기울기 소실**(vanishing gradient) 문제를 부분적으로 완화할 수 있습니다.
---
## 장점과 단점
### 장점
| 장점 | 설명 |
|------|------|
| 제로 중심 출력 | 평균이 0에 가까운 출력을 생성하므로, 다음 레이어의 가중치 업데이트가 더 안정적임 |
| 비선형성 | 복잡한 데이터 패턴 학습 가능 |
| 미분 가능성 | 모든 지점에서 미분 가능하여 역전파 알고리즘에 적합 |
### 단점
| 단점 | 설명 |
|------|------|
| 기울기 소실 문제 | 입력값이 매우 크거나 작을 경우 기울기가 거의 0이 되어, 깊은 네트워크에서 역전파 시 그래디언트가 사라질 수 있음 |
| 계산 비용 | 지수 함수를 포함하므로 ReLU와 같은 단순 함수보다 계산이 복잡함 |
| 출력 포화 | 입력이 커지면 출력이 포화되어 변화가 거의 없음 → 학습 정체 유발 가능 |
---
## tanh vs. 다른 활성화 함수
| 함수 | 출력 범위 | 제로 중심 | 기울기 소실 | 계산 복잡도 | 주요 사용처 |
|------|-----------|-----------|-------------|-------------|-------------|
| **tanh** | (-1, 1) | ✅ | 중간 | 중간 | RNN, 전통적 DNN |
| **Sigmoid** | (0, 1) | ❌ | 심함 | 중간 | 이진 분류 출력층 |
| **ReLU** | [0, ∞) | ❌ | 없음 (양수 구간) | 낮음 | CNN, DNN 일반 레이어 |
| **Leaky ReLU** | (-∞, ∞) | ❌ | 약함 | 낮음 | ReLU의 대안 |
---
## 사용 사례
- **순환 신경망**(RNN): RNN의 내부 상태 업데이트에 tanh가 자주 사용됩니다. 예를 들어, 전통적인 LSTM에서는 셀 상태(candidate cell state) 계산에 tanh 함수를 적용합니다.
- **자기회귀 모델**: 과거 정보를 요약하는 구조에서 출력의 대칭성이 유리하게 작용합니다.
- **생성 모델**: 생성적 적대 신경망(GAN)이나 오토인코더의 일부 레이어에서 사용되기도 합니다.
---
## 코드 예시 (Python)
```python
import numpy as np
import matplotlib.pyplot as plt
def tanh(x):
return np.tanh(x)
def tanh_derivative(x):
return 1 - np.tanh(x) ** 2
# 시각화
x = np.linspace(-5, 5, 100)
y = tanh(x)
dy = tanh_derivative(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='tanh(x)', color='blue')
plt.plot(x, dy, label="tanh'(x)", color='red', linestyle='--')
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.grid(True)
plt.title('tanh 함수와 그 도함수')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
```
---
## 참고 자료 및 관련 문서
- [Activation Function - Wikipedia](https://en.wikipedia.org/wiki/Activation_function)
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). *Deep Learning*. MIT Press.
- 관련 활성화 함수: [Sigmoid](/sigmoid), [ReLU](/relu), [Softmax](/softmax)
- 관련 개념: [신경망](/neural_network), [역전파 알고리즘](/backpropagation), [기울기 소실 문제](/vanishing_gradient)
> **참고**: 최근에는 ReLU 및 그 변형(GELU, Swish 등)이 대부분의 심층 신경망에서 tanh를 대체하고 있으나, 여전히 특정 아키텍처(RNN 기반 모델 등)에서는 유용하게 사용되고 있습니다.